package order;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;

public class getOrder {
    public static void main(String[] args) {
        List<User> users = Arrays.asList(
                new User("u1", "张三"),
                new User("u2", "李四")
        );

        List<Order> orders = Arrays.asList(
                new Order("o1", "u1", new BigDecimal("200"), LocalDateTime.of(2025, 7, 1, 10, 0)),
                new Order("o2", "u1", new BigDecimal("900"), LocalDateTime.of(2025, 7, 3, 14, 0)),
                new Order("o3", "u2", new BigDecimal("800"), LocalDateTime.of(2025, 7, 2, 16, 0))
        );
//        每个用户的所有订单金额总和；
//        用户的最大单笔订单金额；
//        用户的订单总数；
//        用户最近的一笔订单时间（按下单时间降序取第一个）；
//        用户是否是“高价值客户”（总消费金额 > 1000 元）；
//        Map<String,List<UserOrderSummary>> userOrderList = new HashMap<>();
//        //1.将订单按用户分组
          Map<String,List<Order>> orderByUser = orders.stream().collect(Collectors.groupingBy(Order::getUserId));
//        //2.对每个用户的订单做聚合统计
//        // Step 2: 获取这个用户的所有订单（如果没有订单，则是一个空列表）
//        List<Order> userOrders = orderByUser.getOrDefault(user.getId(), Collections.emptyList());
//        // Step 2.1: 计算总消费金额
//        BigDecimal totalAmount = userOrders.stream()
//                .map(Order::getAmount)         // 提取每个订单的金额
//                .reduce(BigDecimal.ZERO, BigDecimal::add); // 累加所有金额
//        // Step 2.2: 找出最大单笔订单金额
//        Optional<BigDecimal> maxAmountOpt = userOrders.stream()
//                .map(Order::getAmount)
//                .max(BigDecimal::compareTo); // 比较两个 BigDecimal 的大小
//        // Step 2.3: 统计订单总数
//        int orderCount = userOrders.size();
//
//// Step 2.4: 找出最近的一笔订单时间
//        Optional<LocalDateTime> lastOrderTimeOpt = userOrders.stream()
//                .map(Order::getOrderTime)
//                .max(LocalDateTime::compareTo); // 取最新的时间
//
//// Step 2.5: 判断是否是高价值客户（总金额 > 1000）
//        boolean isHighValue = totalAmount.compareTo(new BigDecimal("1000")) > 0;
        // Step 3: 遍历所有用户，并合并他们的订单统计信息
        Map<String, UserOrderSummary> summaryMap = users.stream()
                .collect(Collectors.toMap(
                        User::getId, // Key：用户ID
                        user -> {   // Value：构造 UserOrderSummary 对象

                            // Step 3.1: 获取这个用户的所有订单
                            //根据当前用户的 ID 从 orderByUser 分组结果中获取该用户的所有订单，如果该用户没有订单，则返回一个空列表 Collections.emptyList()，避免后续操作出现空指针异常。
                            List<Order> userOrders = orderByUser.getOrDefault(user.getId(), Collections.emptyList());

                            // Step 3.2: 计算总消费金额
                            //BigDecimal::add 是 Java 中 BigDecimal 类的一个方法引用，用于执行两个 BigDecimal 数值的加法操作。
                            /*
                            * 具体逻辑如下：
                                userOrders.stream()：将用户的订单列表转换为流；
                                map(Order::getAmount)：提取每个订单的金额；
                                reduce(BigDecimal.ZERO, BigDecimal::add)：累加所有金额，初始值为 BigDecimal.ZERO。
                            * */
                            BigDecimal totalAmount = userOrders.stream()
                                    .map(Order::getAmount)
                                    .reduce(BigDecimal.ZERO, BigDecimal::add);

                            // Step 3.3: 找出最大单笔订单金额
                            Optional<BigDecimal> maxAmountOpt = userOrders.stream()
                                    .map(Order::getAmount)
                                    .max(BigDecimal::compareTo);

                            // Step 3.4: 统计订单总数
                            int orderCount = userOrders.size();

                            // Step 3.5: 找出最近的一笔订单时间
                            Optional<LocalDateTime> lastOrderTimeOpt = userOrders.stream()
                                    .map(Order::getOrderTime)
                                    .max(LocalDateTime::compareTo);

                            // Step 3.6: 判断是否是高价值客户
                            boolean isHighValue = totalAmount.compareTo(new BigDecimal("1000")) > 0;

                            // Step 3.7: 构建并返回 UserOrderSummary 对象
                            return new UserOrderSummary(
                                    user.getId(),
                                    user.getName(),
                                    totalAmount,
                                    maxAmountOpt.orElse(BigDecimal.ZERO), // 如果没有订单，最大金额设为 0
                                    orderCount,
                                    lastOrderTimeOpt.orElse(null),         // 如果没有订单，时间为 null
                                    isHighValue
                            );
                        }
                ));



    }
}
